package br.unifor.cadeventos.business;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

import br.unifor.cadeventos.dao.EventosDAO;
import br.unifor.cadeventos.entity.Eventos;
import br.unifor.cadeventos.exceptions.BusinessException;
import br.unifor.cadeventos.internacionalizacao.Messagens;

public class EventoBusiness {

	Logger logger = Logger.getLogger(EventoBusiness.class);
	private EventosDAO eventoDAO = new EventosDAO();

	public void criarEvento(Eventos evento) throws BusinessException {
		logger.debug("iniciando o método: "
				+ new Throwable().getStackTrace()[0]);

		try {

			if (validaDataInicioFimAnteriorDataAtual(evento)) {
				if (validaDataFimPosteriorDataInicio(evento.getDataInicio(),
						evento.getDataFim())) {
					eventoDAO.salvar(evento);
				} else {
					throw new BusinessException(Messagens.MSG_EXRG3);
				}
			} else {
				throw new BusinessException(Messagens.MSG_EXRG2);
			}
		} catch (SQLException e) {
			logger.error(Messagens.MSG_INSERCAO_EX, e);
			throw new BusinessException(Messagens.MSG_INSERCAO_EX);
		}

		logger.debug("finalizando o método: "
				+ new Throwable().getStackTrace()[0]);
	}
	
	public List<Eventos> buscaEventoPorTitulo(String titulo) throws BusinessException{
		logger.debug("iniciando o método: "
				+ new Throwable().getStackTrace()[0]);
		try {
			return eventoDAO.buscaEventosPorTitulo(titulo);
		} catch (SQLException e) {
			logger.error(Messagens.MSG_INSERCAO_EX, e);
			throw new BusinessException(Messagens.MSG_INSERCAO_EX);
		} finally {
			logger.debug("finalizando o método: "
					+ new Throwable().getStackTrace()[0]);
		}
		
	}
	
	public List<Eventos> buscaEventoPorLocal(String local) throws BusinessException{
		logger.debug("iniciando o método: "
				+ new Throwable().getStackTrace()[0]);
		try {
			return eventoDAO.buscaEventosPorLocal(local);
		} catch (SQLException e) {
			logger.error(Messagens.MSG_INSERCAO_EX, e);
			throw new BusinessException(Messagens.MSG_INSERCAO_EX);
		} finally {
			logger.debug("finalizando o método: "
					+ new Throwable().getStackTrace()[0]);
		}
		
	}

	private boolean validaDataFimPosteriorDataInicio(Date dataInicio,
			Date dataFim) {
		return dataFim.after(dataInicio);
	}

	private boolean validaDataInicioFimAnteriorDataAtual(Eventos evento) {
		return evento.getDataInicio().after(new Date())
				&& evento.getDataFim().after(new Date());
	}
	
}
